<?php
define( "FIELDP_OK", 		                0  );
define( "FIELDP_PID_PROFILE_NOTRESOLVED",	1  );
define( "FIELDP_PID_URL_NOTRESOLVED",		1  );
define( "FIELDP_UPLOAD_ERR",				2  );
define( "FIELDP_UNKWONW_TUBE",				3  );

class Model_Item extends RL_Model2
{
	/**
	 * Найти и вернуть объект-итем
	 *
	 * @return fobject
	 * @author Alexander Sibiryakov
	 **/
	public function getItem( $item_oid ) {
		// поиск итема
		$item = $this->store->getObject($item_oid);

		if ( !$item ) { echo "Не могу найти эту запись"; return false; }

		// проверка на атрибут "удален"
		if ( $item->data['is_deleted']>0 ) { /*echo "Эта запись была удалена.";*/ return false; }

		return $item;
	}

	/**
	 * Обновить запись
	 *
	 * @return boolean or string
	 * @author Alexander Sibiryakov
	 **/
	public function upItem( fobject $obj ) {
		if ($obj instanceof fobject) {
			$res = $obj->save();
			$res = $obj->updateSense( substr($obj->type, 1) );
			$res = $obj->updateSense( 'allfeed' );
			return true;
		} else {
			return $result; // там строка с ошибкой
		}
	}

	// итемы сохраняются не просто так, а как дети какого-то другого итема
	public function saveItem( fobject $obj, $parent_oid )
	{
		$status = false;

		$db = $this->db;

		if ($obj instanceof fobject) {
			$status = $obj->save();
			$status = $status && !$db->isErrorInTransaction() && $obj->inSense( substr($obj->type, 1) );
			$status = $status && !$db->isErrorInTransaction() && $obj->inSense( 'allfeed' );

			$status = $status && !$db->isErrorInTransaction() && $this->onSave_setPermitions($obj, $parent_oid);
			$status = $status && !$db->isErrorInTransaction() && $this->onSave_notifyEmail($obj, $parent_oid);
			$status = $status && !$db->isErrorInTransaction() && $this->onSave_indexSearch($obj, $parent_oid);
			$status = $status && !$db->isErrorInTransaction() && $this->onSave_notifyEvent($obj, $parent_oid);
			$status = $status && !$db->isErrorInTransaction() && true;
		} else {
			$this->error = 'Ошибка на этапе после пост-процессинга полей. Откат транзакции.';
			$db->rollback();
			$status = false;
		}
		$db->end();
		return $status ? $obj : false;
	}

	public function createItem($objtype_name) {
		return $this->store->create( 'f'.$objtype_name, array("is_deleted"=>0) );
	}


	// -- onSave -- {{{
	// следующие методы описывают всяческие казусы, которые происходят с
	// объектом в момент создания.

	// создать права
	public function onSave_setPermitions ( fobject $obj, $parent_oid )
	{
		$aa = $this->pltGetAclAssistant();

		// --- acl --- {{{
		// прописывает в субъекты и в acl
		$aa->createItem( $obj->id, $parent_oid );
		// для автора права

		$aa->setAcl($obj->id, array('item_edit' => 1, 'item_delete' => 1));
		// --- acl --- }}}

		$this->pltGetRh()->UseClass('RL_ItemRightsLists');
		$rightsLists = new RL_ItemRightsLists($aa);

		$rights = $rightsLists->getViewItemRights(
			$field_values['issue_view_rights'],$field_values['issue_comments_rights'],
			$obj->data['posted_by_id']);

		foreach ( $rights as $role_oid=>$setRights ) {
			if ( !empty($setRights) ) {
				$aa->setAcl($obj->id, $setRights, $role_oid);
			}
		}

		return true;
	} // end of method onSave_setPermitions

	// отправить в рассылку по email
	public function onSave_notifyEmail ( fobject $obj, $parent_oid )
	{
		$aa = $this->pltGetAclAssistant();

		$mail_data = $aa->template_data;
		$mail_data['service'] = array('name'=>'Platonica');
		$mail_data['section'] = $this->getTdi($parent_oid);
		$mail_data['post'] = $obj;
		$mail_data['poster']['data'] = $aa->acl_data['user'];
		$mail_data['poster']['id'] = $aa->acl_data['user']['user_id'];

		require_once 'includes/workaholic.php';
		//Workaholic::addTask(array($this, 'notifyEmail'), $mail_data);
		$this->notifyEmail($mail_data);

		return true;
	} // end of method onSave_notifyEmail
	public function getTdi ($oid)
	{
		return $tdis[ $form->hash['tdi_oid']->model->model_data ];
	} // end of method getTdi
	public function notifyEmail ($data)
	{
		$this->pltGetRh()->UseClass("Model_MailOutbox");
		$outbox = new Model_MailOutbox( $this->pltGetRh(), $this->pltGetAclAssistant());
		$doctype = substr($data['post']->type, 1);
		$outbox->template = "email/doctypes/{$doctype}/create.html";

		$this->pltGetRh()->UseClass("Model_MailSubscriptions");
		$subscribers = new Model_MailSubscriptions ($this->pltGetRh(), $this->pltGetAclAssistant());

		//$user = $this->store->find('select objects where user.oid = :0', array($this->pltGetAclAssistant()->acl_data['user']['user_id']))->next();
		//$subscribers->subscribe($user, 0);

		$subscribers->selectNotifyItems($data['post']->data['community_oid'])->each(array($this, 'post'), $data, $outbox);

		$outbox->delete_after_send = true;
		$outbox->list->select()->each(array($outbox, 'send'), $outbox->list);
		//var_dump($outbox->list->rs->sql);
	} // end of method notifyEmail
	public function post ($recipient, $message, $outbox)
	{
		$message['user'] = $recipient;
		$message['to'] = $recipient->data['email'];
		return $outbox->post($message);
	} // end of method post

	// проиндексировать в поисковике
	public function onSave_indexSearch ( fobject $obj, $parent_oid )
	{
		require_once 'includes/workaholic.php';
		$rh = $this->pltGetRh();

		if ( $rh->use_search ) {
			Workaholic::addTask(array($this, 'hashItem'), $obj);
		}
		return true;
	} // end of method onSave_indexSearch
	public function hashItem( $obj ) {
		$this->pltGetRh()->useClass('Search_Types');
		$searchTypes = new Search_Types($this->pltGetRh(), $this->store);

		$parser = $searchTypes->getTypeParser($obj->type);
		if ( false === $parser ) {
			print "Can`t find parser for '{$obj->type}' type.\n";
			return;
		}

		$parser->linkFromObject($obj);
		$maked = $parser->makeSearchData($obj->id);
		if ( !$maked ) {
			print "Can`t index item with '{$obj->id}' oid.";
			return;
		}

		$parser->cleanWords();
	}

	// создать новое событите
	public function onSave_notifyEvent ( fobject $obj, $parent_oid )
	{
		$aa = $this->pltGetAclAssistant();
		$m_oi = $this->mm->getModel("OpenId", "m");
		$logger = $this->pltGetLogger();

		// добавим событие об обновлении итема, если нам известен пользователь
		if (isset($aa->acl_data['user_id'])) {
			$rs = $m_oi->get_openid_for_user_by_oid($aa->acl_data['user_id']);
			while ($openid = $rs->next()) {
				$logger->event(new Event(time(), "create_item", $openid['openid'], $obj->id));
			}
			$logger->flushLog();
		}
		return true;
	} // end of method onSave_notifyEvent

	// методы достуапа к компонентам платоники
	private function pltGetAclAssistant ()
	{
		return $this->mm->aa;
	} // end of method pltGetAclAssistant
	private function pltGetRh ()
	{
		//var_dumP(array_keys((array) $this->mm));
		return $this->mm->rh;
	} // end of method pltGetAclAssistant
	private function pltGetLogger ()
	{
		return $this->mm->rh->ctx->logger;
	} // end of method pltGetAclAssistant
	// -- onSave -- }}}
}
